﻿#-------------------------------------------------------------------------------
# Name:        uno.py
# Purpose:     implementar o jogo de UNO
#
# Authors:      Kaue,Ana,Will
#
# Created:     09/11/2012
# Copyright:   (c) 2012
# Licence:     GNU General Public License, version 3.0 (GPLv3)
#-------------------------------------------------------------------------------
#TODO:jogador escolhe a quantidade de jogadores
#TODO: implementar as cartas de efeito (+2,+4,wildCard,bloqueio,reverso)
import pygtk,gtk,random,os,time

class Carta():
    def __init__(self,figura,numero,cor,efeito,codigo):
        self.figura = figura
        self.numero = numero
        self.cor   = cor
        self.efeito = efeito
        self.codigo = codigo



class Jogador():
    def __init__(self):
        self.mao = []

    pass



class Jogo():
    def iniciarPartida(self):
        codigo = 0
        self.caminho = os.path.dirname(__file__)
        self.caminho = os.path.join(self.caminho,"cartas\\")
        cores = ["_bl","_ye","_gr","_re"]
        self.vez = 0 #o jogador começa a partida
        self.sentido = 1 #variavel que comtrola o sentido das jogadas :1 horario , -1 antiHorario
        for numero in range(1,10,1):
            for cor in cores:
                figura = gtk.Image()
                figura.set_from_file(self.caminho+str(numero)+cor+".png")
                b = gtk.Button()
                b.set_image(figura)
                c = Carta(b,numero,cor,"nada",codigo)
                codigo += 1
                b.connect("clicked", self.jogar,c)
                self.pilhaCompra.append(c)
        #embaralha a pilha de compra
        random.shuffle(self.pilhaCompra)
        #da 7 cartas para cada jogador
        for jogador in self.jogadores:
            for x in range(7):
                jogador.mao.append(self.pilhaCompra.pop())
        self.topoDescarte = self.pilhaCompra.pop()


    #verifica se o jogador ganhou a partida e mostra o vencedor
    def verificaVitoria(self,jogador):
        if(len(jogador.mao) ==0):
            md = gtk.MessageDialog(self.janela,gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,gtk.BUTTONS_CLOSE, "O JOgador N:"+str(self.jogadores.index(jogador))+"Ganhou !!")
            md.run()
            md.destroy()
            self.janela.hide()
            self.intro.show()

    #gerencia os turnos impedindo um vez invalida
    def proximoJogador(self):
        self.vez += self.sentido#passa a vez para o prox jogador
        if self.vez < 0:
            self.vez = 0
        elif self.vez >= 4:
            self.vez = 0

    #gerencia a pilha de compra
    def verificaPilha(self):
        if len(self.pilhaCompra)== 0:
            print "reiniciando a pilha de compra"
            random.shuffle(self.pilhaDescarte)
            #caso o pilha de compra acabe,embaralha a pilha de descarte e a tranforma em pilha de compra
            for carta in self.pilhaDescarte:self.pilhaCompra.append(carta)
            #self.pilhaCompra = self.pilhaDescarte
            self.pilhaDescarte = []

    def on_sobre(self,w,data=None):
         md = gtk.MessageDialog(self.janela,gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,gtk.BUTTONS_CLOSE, "\nSobre\nSoftware Py-Uno\n2012\nDesenvolvido\nKauê Gongalves\nAna Beatriz Johansen\nWilliam Del Vecchio\n")
         md.run()
         md.destroy()

    def on_ajuda(self,w,data =None):
        self.ajuda.show()

    def on_ajuda_close(self,w,data =None):
        self.ajuda.hide()

    #remove a carta do topo da pilha de compra e a add na mao do jogador
    def on_comprar_carta(self,w,data):
        print "comprando carta..."
        cartaComprada = self.pilhaCompra.pop()
        self.verificaPilha()
        data.mao.append(cartaComprada)
        if w != None:
            cartaComprada.figura.show()
            self.mao.pack_start(cartaComprada.figura,1,1,len(self.mao.get_children())+1)
            self.mao.set_sensitive(0)
            print "carta comprada pelo jogador..."
            self.proximoJogador()
            self.trunoAdversarios()

    #remover carta da mao ,muda a carta do topo da pilha e passar a vez
    #para o proximo jogador
    def jogar(self,w,data):
        if data.numero == self.topoDescarte.numero or data.cor == self.topoDescarte.cor:
            self.topoDescarte = data
            self.imagemTopo.set_from_file(self.caminho+str(self.topoDescarte.numero)+self.topoDescarte.cor+".png")
            for carta in self.jogadores[0].mao:
                if carta.figura==w:
                    self.pilhaDescarte.append(carta)
                    self.jogadores[0].mao.remove(carta)
                    self.mao.remove(w)
                    self.verificaVitoria(self.jogadores[0])
                    self.mao.set_sensitive(0)
                    self.proximoJogador()
                    self.trunoAdversarios()

    def jogarAI(self,jogador,data):
        if data.numero == self.topoDescarte.numero or data.cor == self.topoDescarte.cor:
            self.topoDescarte = data
            self.imagemTopo.set_from_file(self.caminho+str(self.topoDescarte.numero)+self.topoDescarte.cor+".png")
            self.pilhaDescarte.append(data)
            #procura a carta que tem o mesmo gtk.Image e a remove da mão do jogador (figura -> identificador unico)
            c= 0
            for carta in jogador.mao:
                if(carta.figura == data.figura):
                    jogador.mao.remove(carta)
                    break
                c+=1
            self.verificaVitoria(jogador)
            self.proximoJogador()
            return"jogada valida"

    #AI dos adversarios
    def trunoAdversarios(self):
        while self.vez !=  0:
            jogada_feita = False
            print "Jogador numero: ",self.vez


            for carta in self.jogadores[self.vez].mao:
                if(self.jogarAI(self.jogadores[self.vez],carta)=="jogada valida"):
                    jogada_feita = True
                    break

            if(not(jogada_feita)):
                self.on_comprar_carta(None, self.jogadores[self.vez])
                self.proximoJogador()


        self.mao.set_sensitive(True)
        print "Jogador numero: ",self.vez
    def on_comecar(self,data=None):
        self.janela.show()
        self.intro.hide()
    def on_main_window_destroy(self,data=None):
        gtk.main_quit()



    def __init__(self):
        #jogadores[0] -> o proprio jogador
        self.jogadores = [Jogador(),Jogador(),Jogador(),Jogador()]
        self.pilhaCompra = []
        builder = gtk.Builder()
        builder.add_from_file("telas.glade")
        #inicializa as maos dos jogadores e a pilha de compra
        self.iniciarPartida()
        self.pilhaDescarte = []
        self.janela = builder.get_object("main_window")
        self.imagemTopo = builder.get_object("topoPilha")
        self.btn_comprar = builder.get_object("comprar_carta_button")
        self.btn_comprar.connect("clicked", self.on_comprar_carta , self.jogadores[0])
        self.imagemTopo.set_from_file(self.caminho+str(self.topoDescarte.numero)+self.topoDescarte.cor+".png")
        self.mao = builder.get_object("mao_jogador_hbox")
        self.intro = builder.get_object("intro_window")
        self.ajuda = builder.get_object("ajuda_window")
        pos = 1
        for carta in self.jogadores[0].mao:
            self.mao.pack_start(carta.figura, True, True, pos)
            carta.figura.show()
            pos+=1
        builder.connect_signals(self)
        self.intro.show()

if __name__ == '__main__':
    jogo = Jogo()
    gtk.main()